package com.express.dao;

import com.express.bean.Express;
import com.express.exception.DuplicateCodeException;

import java.util.List;
import java.util.Map;

/**
 * @Author: laixiangdong
 * @Date 2020/12/06
 */
public interface BaseExpressDao {
    /**
     * 用于查询数据库中所有的快递的总数及新增，待取件快递的总数及新增
     *
     * @return [{size:快递总数,day:今日新增}, {size:待取件总数,day:今日新增}]
     */
    List<Map<String, Integer>> console();

    /**
     * 用于查询数据库中快递用户的信息总数及新增
     *
     * @return
     */
    Map<String, Integer> userConsole();

    /**
     * @param limit      分页标记，true 表示分页
     * @param offset     sql 起始索引
     * @param pageNumber 每页查询数
     * @return 快递集合
     */
    List<Express> findAll(boolean limit, int offset, int pageNumber);

    /**
     * 用于通过快递单号查询快递
     *
     * @param number 快递单号
     * @return 快递对象
     */
    Express findByNumber(String number);

    /**
     * 用于通过快递验证码查询快递
     *
     * @param code 验证码
     * @return 快递对象
     */
    Express findByCode(String code);

    /**
     * 用于通过快递id查询快递
     *
     * @param id 快递id
     * @return 快递对象
     */
    Express findByID(int id);

    /**
     * 用于通过用户手机号查询所有快递
     *
     * @param userPhone 用户手机号
     * @return 快递集合
     */
    List<Express> findByUserPhone(String userPhone);
    List<Express> findByUserPhoneAndStatus(String userPhone, int status);

    /**
     * 用于通过录入人员手机号查询所有快递
     *
     * @param sysPhone 录入人手机号
     * @return 快递集合
     */
    List<Express> findBySysPhone(String sysPhone);

    /**
     * 用于添加快递
     *
     * @param express 快递对象
     * @return true 表示添加成功
     */
    Boolean insert(Express express) throws DuplicateCodeException;

    /**
     * 用于通过快递id更新快递信息
     *
     * @param id         快递id
     * @param newExpress 新的快递对象
     * @return true 表示更新成功
     */
    Boolean update(int id, Express newExpress);

    /**
     * 用于通过快递id删除快递
     *
     * @param id 快递id
     * @return true 表示删除成功
     */
    Boolean delete(int id);

    /**
     * 用于取件时更新快递状态
     *
     * @param number 单号
     * @return true 表示取件成功
     */
    Boolean updateStatus(String code);
}
